//暴露husky自动化部署的脚本方法步骤
const cp = require('child_process')
const util = require('util')
// const exec = util.promisify(cp.exec)
const path = require('path')
const inquirer = require('inquirer')
const {
  copyFolder,
  gitDownFile,
  generateFile,
  dotExistDirectoryCreate,
} = require('../createFile/create')
const {
  resolve,
  log,
  successLog,
  errorLog,
  showLoading,
  hideLoading,
  getHirtime,
} = require('../utils.js')
// const util = require('util');
// const rm = util.promisify(require('shelljs').rm)
const exec = require('shelljs').exec // util.promisify(require('shelljs').exec);
// 可以深度删除依赖包相对于deletefolder方法
// const rm = require('shelljs').rm
const rm = util.promisify(require('rimraf'))
module.exports = async () => {
  // 交互式命令 根据用户输入 创建文件
  function createFileCommander() {
    //选择框架命令
    inquirer
      .prompt([
        {
          type: 'list',
          name: 'project',
          message: '请选择生成的脚手架类型',
          choices: [
            { name: '小程序page/component/H5-vue单文件', value: 'file' },
            { name: '小程序/uni-app/h5-vue开箱即用脚手架', value: 'frame' },
            // { name: '小程序/uni-app/h5-vue活动模版(大转盘等)', value: 'frame' },
          ],
          default: ['file'],
        },
      ])
      .then(async function (res) {
        console.log('prompt1--->', res)
        const { project } = res
        if (project == 'file') {
          prompt1()
        } else if (project == 'frame') {
          prompt2()
        }
      })

    // 选择模版命令
    const prompt1 = () => {
      inquirer
        .prompt([
          {
            type: 'list',
            name: 'template',
            message: '请选择生成的模板文件',
            choices: [
              { name: '小程序page文件', value: 'page' },
              { name: '小程序component文件', value: 'component' },
              { name: 'H5-vue文件', value: 'vue' },
            ],
            default: ['page'],
          },
          {
            type: 'input',
            name: 'inputName',
            message:
              '请输入文件名即可(可不写文件格式, 如packageActive/pages/newPgae):',
          },
        ])
        .then(async function (res) {
          let { inputName, template } = res
          if (!inputName) {
            errorLog('tips: 请输入文件名')
            throw Error('请输入文件名')
            return
          }
          // 去掉首个"/"  根目录开始不需要的
          if (inputName[0] == '/') {
            inputName = inputName.slice(1)
          }
          let index = inputName.indexOf('.')
          if (index !== -1) {
            // 去掉.号后面
            inputName = inputName.slice(0, index)
          }
          const inputArr = inputName.split('/')
          console.log('inputArr', inputArr)
          showLoading()
          try {
            // 循环遍历生成模板
            // __dirname： 运行的js的所在的目录    process.cwd() 用户输入命令时的所在目录
            async function forEachSetTemplate() {
              if (template === 'vue') {
                let templateFile = path.join(
                  __dirname,
                  `../template/${template}/${template}.vue`
                )
                await generateFile(
                  resolve(inputName + '.vue'),
                  fs.readFileSync(templateFile).toString()
                )
              } else {
                ;['.js', '.json', '.less', '.wxss', '.wxml'].forEach(
                  async (item, index) => {
                    let templateFile = path.join(
                      __dirname,
                      `../template/${template}/${template}${item}`
                    )
                    await generateFile(
                      resolve(inputName + item),
                      fs.readFileSync(templateFile).toString()
                    )
                  }
                )
              }
            }
            // 有/ 说明有目录结构 看是否要创建
            if (inputName.includes('/')) {
              let directory = inputArr.slice(0, inputArr.length - 1).join('/')
              log(`正在生成目录`)
              await dotExistDirectoryCreate(directory)
              log(`正在生成 template 文件`)
              await forEachSetTemplate()
            } else {
              // 当前目录下创建
              log(`正在生成 template 文件`)
              await forEachSetTemplate()
            }
          } catch (error) {
            errorLog('执行错误')
            errorLog(error)
          }
          hideLoading()
          log('运行时间：' + getHirtime())
        })
    }

    //选择生成框架
    const prompt2 = () => {
      inquirer
        .prompt([
          {
            type: 'list',
            name: 'frame',
            message: '请选择生成的框架',
            choices: [
              {
                name: '开源vue-element-admin框架',
                value: 'https://gitee.com/panjiachen/vue-element-admin.git',
              },
              {
                name: '开源vue-antd-admin框架',
                value: 'https://github.com/iczer/vue-antd-admin.git',
              },
              {
                name: '时代电商团队-自有前端框架',
                value:
                  'ssh://git@8.129.6.138:8091/times-service-mall/tsm-web-team.git',
              },
              // { name: 'uni-app框架', value: 'https://github.com/zhangli254804018/app-h5.git' },
              // { name: '微信小程序原生框架(mobx)', value: 'https://github.com/zhangli254804018/app-miniProgram.git' },
              // { name: 'umi框架(react-antd-pro)', value: 'umi' },
              // { name: 'vue-admin框架(vue-admin-element)', value: 'https://github.com/zhangli254804018/app-admin.git' },
            ],
            default: [
              'ssh://git@8.129.6.138:8091/times-service-mall/tsm-web-team.git',
            ],
          },
          {
            type: 'input',
            name: 'inputName',
            message: '请输入文件名即可(可不写文件格式, 如vue-app/):',
          },
        ])
        .then(async function (res) {
          let { inputName, frame } = res
          console.log('prompt2------->', frame)
          // 新增修改函数
          const inputArr = inputName.split('/')
          async function copyFolders(directory) {
            if (frame.includes('.git')) {
              await gitDownFile(directory, frame)
              return Promise.resolve()
            }
            let framFile = path.join(__dirname, `../frame/${frame}`)
            let tarFile = resolve(directory)
            copyFolder(framFile, tarFile)
            return Promise.resolve()
          }
          showLoading()
          try {
            // 说明有目录结构 看是否要创建
            if (inputName.includes('/')) {
              let directory = inputArr.slice(0, inputArr.length - 1).join('/')
              log(`正在生成目录`)
              await dotExistDirectoryCreate(directory)
              log(`正在生成 框架 文件`)
              await copyFolders(directory)
            } else {
              await dotExistDirectoryCreate(inputName)
              // 当前目录下创建
              log(`正在生成 框架 文件`)
              await copyFolders(inputName)
            }
          } catch (error) {
            errorLog(error)
          }
          hideLoading()
          log('运行时间：' + getHirtime())
        })
    }
  }
  createFileCommander()
}
